home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
ASTRONOM
/
2191.ZIP
/
SHOW.ZIP
/
COLOR3D.BAS
< prev
next >
Wrap
BASIC Source File
|
1986-01-29
|
7KB
|
140 lines
1000 ' ********* COLOR3D.BAS *********
1010 ' Draws a 3D, perspective image of a molecule on IBM PCs with BASICA.
1020 ' For private, noncommercial use only.
1030 ' John J. Farrell *** April 1, 1985
1040 ' Inspired by Earl Kirkland's MODEL3D.BAS for the Mac, BYTE, Feb. 1985.
1050 SCREEN 1 'medium resolution; color
1060 COLOR 0,1 'background = black(0); cyan(1); magenta(2); white(3)
1070 KEY OFF
1080 DEFINT I-N: DEFSNG O-Z: DEFSNG A-G
1090 DIM X(200), Y(200), Z(200), S(200), COL(200),COLPAT(200),TIL$(200)
1100 '
1110 ' Ask for input parameters.
1120 CLS: INPUT "Data file name:", FILE$
1130 INPUT "Azim., polar angles (phi, theta):", PHI, THETA
1140 INPUT "Viewing distance:",VIEWD
1150 INPUT "Size magnitude:",SMAG
1160 SMAG = 1.15*SMAG
1170 ' DISTORT is used later to account for fact that one unit of x
1180 ' on screen (horizonal) is not equal to one unit of z (vertical).
1190 DISTORT = 1.2
1200 ' Convert degrees to radians.
1210 PHI = PHI*3.14159/180!: THETA = THETA*3.14159/180!
1220 CP = COS(PHI): SP = SIN(PHI): CT = COS(THETA): ST = SIN(THETA)
1230 '
1240 OPEN FILE$ FOR INPUT AS #1
1250 ' Set xmin very large and xmax very small.
1260 XMIN = 1000000!: XMAX = -XMIN: YMIN = XMIN: YMAX = XMAX
1270 ZMIN = XMIN: ZMAX = XMAX: N = 0
1280 ' Read data file: color, x,y,z (atomic coords),r (Angstroms).
1290 WHILE NOT EOF(1)
1300 N = N + 1
1310 INPUT #1,COLPAT(N), X(N),Y(N), Z(N), S(N)
1320 IF COLPAT(N)<= 3 THEN COL(N) = COLPAT(N): TIL$(N) = CHR$(&HAA)
1330 IF COLPAT(N) = 4 THEN COL(N) = 1: TIL$(N) =CHR$(&H66) + CHR$(&H99)
1340 IF COLPAT(N) = 5 THEN COL(N) = 3: TIL$(N) = CHR$(&HAF) +CHR$(&HAF) + CHR$(&HFA) + CHR$(&HFA)
1350 IF COLPAT(N) = 6 THEN COL(N) = 2: TIL$(N) =CHR$(&H55) + CHR$(&HFF)
1360 IF COLPAT(N) = 7 THEN COL(N) = 3: TIL$(N) = CHR$(&HAA) + CHR$(&H69) + CHR$(&HFF) + CHR$(&H5A) + CHR$(&HA5) + CHR$(&HFF) + CHR$(&H96) + CHR$(&HAA)
1370 IF COLPAT(N) = 8 THEN COL(N) = 3: TIL$(N) = CHR$(&H5A) + CHR$(&H5A) + CHR$(&HA5) + CHR$(&HA5)
1380 IF COLPAT(N) = 9 THEN COL(N) = 3: TIL$(N) = CHR$(&HAA) + CHR$(&HAA) + CHR$(&H55) + CHR$(&H55)
1390 IF COLPAT(N) = 10 THEN COL(N) = 3: TIL$(N) = CHR$(&HAA) + CHR$(&HFF)
1400 IF COLPAT(N) = 11 THEN COL(N) = 3: TIL$(N) = CHR$(&H5F) + CHR$(&H5F) + CHR$(&HF5) + CHR$(&HF5)
1410 IF COLPAT(N) = 12 THEN COL(N) = 3: TIL$(N) = CHR$(&H69) + CHR$(&HAA) + CHR$(&HAA) + CHR$(&H96)
1420 IF COLPAT(N) = 13 THEN COL(N) = 3: TIL$(N) = CHR$(&HBB)
1430 IF COLPAT(N) = 14 THEN COL(N) = 3: TIL$(N) = CHR$(&HAB)
1440 IF COLPAT(N) = 15 THEN COL(N) = 3: TIL$(N) = CHR$(&H57)
1450 IF COLPAT(N) = 16 THEN COL(N) = 3: TIL$(N) = CHR$(&HAB) + CHR$(&HAB) + CHR$(&HFF) + CHR$(&HFF)
1460 IF COLPAT(N) = 17 THEN COL(N) = 3: TIL$(N) = CHR$(&H57) + CHR$(&H57) + CHR$(&HFF) + CHR$(&HFF)
1470 IF COLPAT(N) = 18 THEN COL(N) = 3: TIL$(N) = CHR$(&HFE) + CHR$(&HFA) + CHR$(&HFA) + CHR$(&HEA) + CHR$(&HFA) + CHR$(&HFE)
1480 IF COLPAT(N) = 19 THEN COL(N) = 3: TIL$(N) = CHR$(&HEB) + CHR$(&HAA) + CHR$(&HAA) + CHR$(&HEB)
1490 IF COLPAT(N) = 20 THEN COL(N) = 3: TIL$(N) = CHR$(&H77)
1500 IF COLPAT(N) = 21 THEN COL(N) = 3: TIL$(N) = CHR$(&H69) + CHR$(&HAA) + CHR$(&HAA) + CHR$(&H69)
1510 IF COLPAT(N) = 22 THEN COL(N) = 3: TIL$(N) = CHR$(&HAA) + CHR$(&HBE) + CHR$(&HBE) + CHR$(&HBE) + CHR$(&HBE) + CHR$(&HAA)
1520 IF COLPAT(N) = 23 THEN COL(N) = 3: TIL$(N) = CHR$(&HE9) + CHR$(&H9E)
1530 IF COLPAT(N) = 24 THEN COL(N) = 3: TIL$(N) = CHR$(&HE9) + CHR$(&HE9)
1540 ' Find maximum and minimum values for x,y,z.
1550 IF X(N) > XMAX THEN XMAX = X(N)
1560 IF X(N) < XMIN THEN XMIN = X(N)
1570 IF Y(N) > YMAX THEN YMAX = Y(N)
1580 IF Y(N) < YMIN THEN YMIN = Y(N)
1590 IF Z(N) > ZMAX THEN ZMAX = Z(N)
1600 IF Z(N) < ZMIN THEN ZMIN = Z(N)
1610 WEND
1620 PRINT N "atoms"
1630 PRINT "rotating..."
1640 ' Find center values for x,y,z.
1650 XCEN = .5*(XMAX+XMIN): YCEN = .5*(YMIN + YMAX): ZCEN = .5*(ZMIN+ZMAX)
1660 ' Rotate molecule around its center.
1670 FOR I = 1 TO N
1680 XA = X(I) - XCEN: YA = Y(I) - YCEN
1690 X(I) = CP*XA+SP*YA: Y(I) = -SP*XA+CP*YA
1700 YA = Y(I): ZA = Z(I) - ZCEN
1710 Y(I) = CT*YA+ST*ZA: Z(I) = -ST*YA+CT*ZA
1715 IF VIEWD < Y(I) THEN CLS: PRINT "Viewing distance is within molecule! Rerun with a larger viewing distance.": GOTO 2100
1720 NEXT I: PRINT "sorting..."
1730 '
1740 ' Sort by depth (shell sort).
1750 IGAP = INT(CSNG(N)/2!)
1760 WHILE IGAP >= 1
1770 FOR I = IGAP +1 TO N
1780 FOR J = I-IGAP TO 1 STEP -IGAP
1790 JG = J + IGAP
1800 IF Y(J) <= Y(JG) THEN GOTO 1850
1810 SWAP X(J),X(JG): SWAP Y(J), Y(JG)
1820 SWAP Z(J), Z(JG): SWAP S(J), S(JG)
1830 SWAP COL(J), COL(JG): SWAP COLPAT(J), COLPAT(JG): SWAP TIL$(J),TIL$(JG)
1840 NEXT J
1850 NEXT I
1860 IGAP = INT(CSNG(IGAP)/2!)
1870 WEND
1880 '
1890 CLS
1900 ' Perspective projection and scale coordinates.
1910 SCALE = -1000000!: SMAX = SCALE
1920 FOR I = 1 TO N
1930 YA = 1!/(VIEWD - Y(I)): X(I) = X(I) *YA: Z(I) = Z(I) * YA: S(I) = S(I)*YA
1940 IF SCALE < ABS(X(I)) THEN SCALE = ABS(X(I))
1950 IF SCALE < ABS(Z(I)) THEN SCALE = ABS(Z(I))
1960 IF SMAX <S(I) THEN SMAX = S(I)
1970 NEXT I: SCALE = 75!/(SCALE + .5*SMAX*SMAG)
1980 SCALEX = SCALE*DISTORT
1990 '
2000 FOR I = 1 TO N
2010 ' Find screen x (ix) and screen z (iz) and screen radius (ir).
2020 ' Center of screen is x = 160 and z = 100.
2030 IX = INT(X(I)*SCALEX+ 160!): IZ = INT(Z(I)*SCALE + 100!)
2040 IR = INT(S(I)*SCALE*SMAG): IRZ = IR/DISTORT
2050 COL = COL(I): COLPAT = COLPAT(I): TIL$ = TIL$(I)
2060 GOSUB 2130
2070 NEXT I
2080 CLOSE#1
2090 IF INKEY$ = "" THEN 2090
2100 END
2110 ' Draw patterned circles at ix,iz with radius ir.
2120 ' Draw a circle in color.
2130 CIRCLE (IX,IZ),IR+1,COL
2140 ' Paint the circle black. Start in center and at four extremities
2150 'in an attempt to completely blacken the circle.
2160 PAINT (IX,IZ),0,COL: PAINT (IX-IR+1,IZ),0,COL: PAINT (IX+IR-1,IZ),0,COL: PAINT (IX,IZ-IRZ+1),0,COL: PAINT (IX,IZ+IRZ-1),0,COL
2170 ' Paint the circle in color.
2180 PAINT (IX,IZ),COL,COL: PAINT (IX-IR+1,IZ),COL,COL: PAINT (IX+IR-1,IZ),COL,COL: PAINT (IX,IZ-IRZ+1),COL,COL: PAINT (IX,IZ+IRZ-1),COL,COL
2190 ' Draw circle with a new border color and paint black.
2200 IF COL = 1 THEN COLBOR = 3
2210 IF COL = 2 THEN COLBOR = 3
2220 IF COL = 3 THEN COLBOR = 1
2230 CIRCLE (IX,IZ),IR+1,COLBOR
2240 PAINT (IX,IZ),0,COLBOR
2250 ' Paint circle with final pattern.
2260 IF COLPAT <=3 THEN PAINT (IX,IZ),COL,COLBOR ELSE PAINT (IX,IZ),TIL$,COLBOR
2270 ' Draw the circle in black and paint it black.
2280 CIRCLE (IX,IZ),IR+1,0
2290 PAINT (IX,IZ),0,0: PAINT (IX-IR+1,IZ),0,0: PAINT (IX+IR-1,IZ),0,0: PAINT (IX,IZ-IRZ+1),0,0: PAINT (IX,IZ+IRZ-1),0,0
2300 ' Draw the circle in color and paint with final pattern.
2310 CIRCLE (IX,IZ),IR+1,COLBOR
2320 IF COLPAT <=3 THEN PAINT (IX,IZ),COL,COLBOR ELSE PAINT (IX,IZ),TIL$,COLBOR
2330 ' Draw the circle in black.
2340 CIRCLE (IX,IZ),IR+1,0
2350 RETURN
(IX,IZ),COL,COLBOR ELSE PAINT (IX,IZ),TIL$,COLBOR
2330 ' Draw the circle in black.
2340 CI